import Vue from "vue";
import VueRouter from "vue-router";
import routes from "./routes";
import store from "@/store"

Vue.use(VueRouter);

//因为编程式路由导航重复导航的是时候 会报错,我们需要重写push和replace解决这个问题
//1. 保存旧的push方法
const oldPushMethod = VueRouter.prototype.push;
//2. 覆盖原来的push方法 重写push
VueRouter.prototype.push = function (
  location,
  onComplate = () => {},
  onAbort = () => {}
) {
  //内部使用的还是以前的push方法,但是我们给添加了处理异常的回调函数
  return oldPushMethod.call(this, location, onComplate, onAbort);
};

//1. 保存旧的replace方法
const oldReplaceMethod = VueRouter.prototype.replace;
//2. 覆盖原来的push方法 重写push
VueRouter.prototype.replace = function (
  location,
  onComplate = () => {},
  onAbort = () => {}
) {
  //内部使用1的还是以前的push方法,但是我们给添加了处理异常的回调函数
  return oldReplaceMethod.call(this, location, onComplate, onAbort);
};

const router = new VueRouter({
  routes,
  mode: "history",
  scrollBehavior(){
    return {x:0,y:0}
  }
});
const whitePath = ["login","home","register","search","detail","addCartSuccess",];
router.beforeEach(async(to,from,next)=>{
  // token校验（路由权限控制）
  const token = store.state.user.token;
  if(token){
     // 如果token存在
      if(to.name === "login"){
        next("/home");
      }else{
        //判断使用有用户信息
        const isUserInfo = !!store.state.user.userInfo.nickname;
        if(isUserInfo){
          // 如果用户信息存在，则获取用户信息
          next();
        }else{
          try{
            // 如果用户信息不存在，则获取用户的信息
            await store.dispatch("user/getUserInfo");
            // 如果用户信息请求成功则直接放行
            next();
          }catch(e){
            // 请求用户失败，则跳转去重新登录
            store.dispatch("user/getReseUser");//重置user中的所有信息
            next(`/login?redirect=${to.name}`)
          }
        }
      }
    }else{
      // 如果token不存在
      if(whitePath.includes(to.name)){
        next()
      }else{
        next(`/login?redirect=${to.name}`)
      
    }
  }
})

export default router;
